package bancosys.tec.persist.audit.domain;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import jmine.tec.persist.annotation.Alias;
import jmine.tec.persist.annotation.Index;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

import bancosys.tec.component.Documentation;
import bancosys.tec.persist.bussobj.PersistableBusinessObject;

/**
 * @created 03/10/2007
 * @author Gustavo Almeida
 */
@javax.persistence.Entity
@Table(name = "AUDIT_ENTITY")
@Alias("AUDENT")
@SequenceGenerator(name = "SEQ_AUDENT", sequenceName = "SEQ_AUDENT")
@Documentation("ARMAZENA AS ENTIDADES DO PROCESSO DE AUDITORIA.")
@Index(suffix = "JT_0", columns = { "COD_ENTITY", "CLASS" })
public class AuditEntity extends PersistableBusinessObject {
    private static final int MAX_VARCHAR_LEN = 255;

    private Long id;

    private String className;

    private String name;

    private Long entityId;

    private List<AuditVersion> versions;

    /**
     * Construtor.
     */
    public AuditEntity() {
        this.versions = new ArrayList<AuditVersion>();
    }

    /**
     * Adiciona uma versão.
     * 
     * @param version versão.
     */
    public void addVersion(AuditVersion version) {
        version.setEntity(this);
        this.versions.add(version);
    }

    /**
     * Devolve as properties dessa modificação.
     * 
     * @return as properties dessa modificação.
     */
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "entity")
    @Cascade({ CascadeType.ALL, CascadeType.DELETE_ORPHAN })
    @OrderBy("ts")
    public List<AuditVersion> getVersions() {
        return this.versions;
    }

    /**
     * Devolve o id de persistência.
     * 
     * @return o id de persistência.
     */
    @Id
    @Column(name = "COD_AUDIT_ENTITY")
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "SEQ_AUDENT")
    @Documentation("CODIGO DO REGISTRO DE AUDITORIA DA ENTIDADE.")
    public Long getId() {
        return this.id;
    }

    /**
     * Define o id.
     * 
     * @param id O id a ser definido.
     */
    public void setId(Long id) {
        this.id = id;
    }

    /**
     * Devolve o nome da classe da entidade.
     * 
     * @return o nome da classe da entidade.
     */
    @Column(name = "CLASS", length = MAX_VARCHAR_LEN, nullable = false)
    @Documentation("CLASSE JAVA DA ENTIDADE DO PROCESSO DE AUDITORIA.")
    public String getClassName() {
        return this.className;
    }

    /**
     * Define o className.
     * 
     * @param className O className a ser definido.
     */
    public void setClassName(String className) {
        this.className = className;
    }

    /**
     * Devolve o nome da propriedade.
     * 
     * @return o nome da propriedade.
     */
    @Column(name = "NAME", length = MAX_VARCHAR_LEN, nullable = false)
    @Documentation("NOME DA ENTIDADE DO PROCESSO DE AUDITORIA.")
    public String getName() {
        return this.name;
    }

    /**
     * Define o name.
     * 
     * @param name O name a ser definido.
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * Devolve o id da entidade.
     * 
     * @return o id da entidade.
     */
    @Column(name = "COD_ENTITY", nullable = false)
    @Documentation("IDENTIFICADOR DA ENTIDADE (PK) DO PROCESSO DE AUDITORIA.")
    public Long getEntityId() {
        return this.entityId;
    }

    /**
     * Define o entityId.
     * 
     * @param entityId O entityId a ser definido.
     */
    public void setEntityId(Long entityId) {
        this.entityId = entityId;
    }

    /**
     * Define o versions.
     * 
     * @param versions O versions a ser definido.
     */
    public void setVersions(List<AuditVersion> versions) {
        this.versions = versions;
    }
}
